package com.nettyPractice;



import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.AllArgsConstructor;

/**
 *  自定义编码器。
 *  网络传输需要通过字节流来实现，
 *  ByteBuf 可以看作是 Netty 提供的字节数据的容器，使用它会让我们更加方便地处理字节数据。
 */
@AllArgsConstructor
public class NettyKryoEncoder extends MessageToByteEncoder<Object> {
  private final Serializer serializer;
  private final Class<?> genericClass;

  /**
   * 将对象转化为字节码然后写入到 ByteBuf 中
   * @param channelHandlerContext
   * @param object
   * @param byteBuf
   * @throws Exception
   */
  @Override
  protected void encode(ChannelHandlerContext channelHandlerContext, Object object, ByteBuf byteBuf){
    if(genericClass.isInstance(object)){
      // 1. 将对象转化为byte
      byte[] body = serializer.serlialize(object);
      // 2. 读取消息的长度
      int dataLength = body.length;
      // 3. 写入消息对应的字节数组长度,writerIndex 加 4
      byteBuf.writeInt(dataLength);
      // 4. 将byte消息写入ByteBuf
      byteBuf.writeBytes(body);
    }
  }
}
